/*
 * Element.h
 *
 *  Created on: 2010-10-26
 *      Author: wenjian
 */

#ifndef ELEMENT_H_
#define ELEMENT_H_
#include "../commons.h"
#include "../draw/AbstractElement.h"
#include <wingdi.h>
#include <GdiPlus.h>

namespace Ed {

  class Element: public Ed::AbstractElement {
    public:
      Element();
      virtual ~Element();

//      /**
//       * 构建路径
//       */
//      virtual void createPath();

      /**
       * 重画与此元素相交的其它元素, 排除<code>excludeds</code>中的元素
       */
      virtual void redrawIntersection(const std::vector<AbstractElement*>* excludeds=NULL);

      /**
       * 重画与此元素相交的元素, 包括相交元素和自己, 排除<code>excludeds</code>中的元素
       */
      virtual void redrawAll(const std::vector<AbstractElement*>* excludeds=NULL);

      /**
       * 检查是否与点(x, y)相交
       */
      virtual bool intersects(real x, real y);

      /**
       * 检查是否与参数矩形区相交
       */
      virtual bool intersects(const Gdiplus::RectF* rect);

      /**
       * 检查是否与参数矩形区相交
       */
      virtual bool intersects(const vector<const Gdiplus::RectF*>* rects);

      /**
       * 检查是否与元素e相交
       */
      virtual bool intersects(Element* e);

      /**
       * 检查是否与元素els相交
       */
      virtual bool intersects(const vector<Element*>* els);

      /**
       * 返回包含元素所有可视内容的最大矩形，包括控制点，如果有
       */
      virtual const Gdiplus::RectF* getBoundRect() const;

      /**
       * 在outBoundRect中返回包含元素所有可视内容的最大矩形, adjustVal为调整值，如果为正值，将放大矩形，负值缩小矩形
       */
      virtual Gdiplus::RectF* getBoundRect(Gdiplus::RectF* outBoundRect, real adjustVal) const;

      /**
       * 创建包含元素所有可视内容的最大矩形区域
       */
      virtual void createBoundRect();

      /**
       * 画此元素
       */
      virtual inline void draw(Gdiplus::Graphics* g) {
        setModified(false);
        setRedraw(false);
      }

    protected:
      //最大边界矩形
      Gdiplus::RectF* boundRect;

    private:
      AbstractElements* redrawElements;
      void prepareRedrawElements();
  };

}

#endif /* ELEMENT_H_ */
